package com.tinet.sistReserva.DAO;

import java.util.ArrayList;

import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.Query;

import com.tinet.sistReserva.model.Usuario;

/**
 * 
 * Clase que implementa los metodos de la interfaz InterfazUsuarioBean.
 * 
 * @author Frmancil
 */
public class UsuarioDao implements InterfazUsuarioDao {
    /**
     * Manejador de entidad.
     */
    private EntityManager em;

    /**
     * Constructor que inicializa el manejador de entidad em para cada objeto
     * UsuarioDAO creado.
     * 
     * @param em
     *            Manejador de entidad.
     */
    public UsuarioDao(EntityManager em) {
        this.em = em;
    }

    /**
     * {@inheritDoc}
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void agregar(Usuario nuevoUsuario) {
        em.persist(nuevoUsuario);

    }

    /**
     * {@inheritDoc}
     */
    public void eliminar(Usuario usuarioAEliminar) {
        if (buscar(usuarioAEliminar) != null) {
            em.remove(buscar(usuarioAEliminar));
        }

    }

    /**
     * {@inheritDoc}
     */
    public void actualizar(Usuario usuarioAActualizar) {
        if (buscar(usuarioAActualizar) != null) {
            em.merge(usuarioAActualizar);
        }

    }

    /**
     * {@inheritDoc}
     */
    public Usuario buscar(Usuario usuarioABuscar) {
        return (Usuario) em
                .createQuery(
                        "SELECT U FROM Usuario U WHERE U.username=:username")
                .setParameter("username", usuarioABuscar.getUsername())
                .getSingleResult();
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    public ArrayList<Usuario> listar() {
        return (ArrayList<Usuario>) em.createQuery("SELECT U FROM Usuario U")
                .getResultList();

    }

    /**
     * {@inheritDoc}
     */
    public Usuario login(Usuario usuarioAIngresar) {
        Query q =
                em.createQuery("SELECT U FROM Usuario U WHERE"
                        + " U.username=:username AND U.password=:password");
        q.setParameter("username", usuarioAIngresar.getUsername());
        q.setParameter("password", usuarioAIngresar.getPassword());
        Usuario usuario = (Usuario) q.getSingleResult();
        return usuario;
    }

}
